#pragma once

#include<iostream>
#include<string>
#include<vector>
#include"InetAddr.hpp"

class Route
{
private:
    //判断这个用户是否存在
    bool IsExist(const InetAddr& addr)
    {
        for(auto& user : _online_user)
        {
            if(user == addr)
            {
                return true;
            }
        }
        return false;
    }
    //增加用户
    void AddUser(const InetAddr& addr)
    {
        //用户不存在就增加
        if(!IsExist(addr))
            _online_user.push_back(addr);
    }
    //删除用户
    void DeleteUser(const std::string& message , const InetAddr& addr)
    {
        //定协议
        if(message == "QUIT")
        {
            auto iter = _online_user.begin();
            for(;iter!=_online_user.end();iter++)
            {
                if(*iter == addr)
                {
                    _online_user.erase(iter);
                    break;
                }
            }
        }
    }
    //将消息发给所有人
    void SendMessageToAll(int sockfd , std::string& message , InetAddr& addr)
    {
        for(auto& user: _online_user)
        {
            LOG(LogLevel::DEBUG) << "route [" << message << "] to: " << user.ToString();

            std::string info = addr.ToString();
            info +="# ";
            info += message;

            sendto(sockfd , info.c_str(), info.size() , 0 , user.Addr() , user.Length());
        }
    }
public:
    Route(){}
    //将消息发给所有人
    void RouteMessageToAll(int sockfd , std::string& message , InetAddr& addr)
    {
        AddUser(addr);
        SendMessageToAll(sockfd , message , addr);
        DeleteUser(message, addr);
    }
    ~Route(){}
private:
    //临界资源 - 加锁
    std::vector<InetAddr> _online_user;//在线用户

};